package ar.edu.unsam.algo3.plantasvszombies.ui.windows

import ar.edu.unsam.algo3.plantasvszombies.dominio.Jardin
import ar.edu.unsam.algo3.plantasvszombies.dominio.JardinZen
import ar.edu.unsam.algo3.plantasvszombies.dominio.Planta
import ar.edu.unsam.algo3.plantasvszombies.ui.ApplicationModels.JardinZenAppModel
import java.awt.Color
import org.uqbar.arena.bindings.NotNullObservable
import org.uqbar.arena.bindings.ObservableProperty
import org.uqbar.arena.layout.HorizontalLayout
import org.uqbar.arena.layout.VerticalLayout
import org.uqbar.arena.widgets.Button
import org.uqbar.arena.widgets.Label
import org.uqbar.arena.widgets.Panel
import org.uqbar.arena.widgets.Selector
import org.uqbar.arena.widgets.tables.Column
import org.uqbar.arena.widgets.tables.Table
import org.uqbar.arena.windows.Dialog
import org.uqbar.arena.windows.MessageBox
import org.uqbar.arena.windows.WindowOwner
import org.uqbar.commons.utils.Observable

@Observable
class JardinZenWindow extends Dialog<JardinZenAppModel> {

	new(WindowOwner parent, JardinZen unJardinZen, Jardin unJardin) {
		super(parent, new JardinZenAppModel)
		modelObject.jardinZen = unJardinZen
		modelObject.jardin = unJardin
		modelObject.actualizar //Corre este método cuando se crea la ventana
	}

	new(WindowOwner parent, JardinZen zen) {
		super(parent, new JardinZenAppModel)
	}

	override def createMainTemplate(Panel mainPanel) {
		title = "Jardin Zen"
		taskDescription = "Seleccione una planta y una mejora para aumentar sus poderes"

		super.createMainTemplate(mainPanel)
	}

	override protected addActions(Panel actionsPanel) {
		actionsPanel.setLayout(new HorizontalLayout)

		new Button(actionsPanel).setCaption("Siguiente Jardin Zen").onClick[|modelObject.siguienteZen].setAsDefault.
			disableOnError

		new Button(actionsPanel).setCaption("Volver").onClick[|this.close]
	}

	override def createFormPanel(Panel mainPanel) {
		val tituloPanel = new Panel(mainPanel)
		tituloPanel.setLayout(new HorizontalLayout)

		val lblTipo = new Label(tituloPanel)
		lblTipo.foreground = Color::BLUE
		lblTipo.fontSize = 20
		lblTipo.bindValueToProperty("jardinZen.descripcion")
		lblTipo.setWidth(450)

		this.createTblPanel(mainPanel)
	}

	def void createTblPanel(Panel mainPanel) {

		val tblPanel = new Panel(mainPanel).setLayout(new VerticalLayout)

		val recursosPanel = new Panel(tblPanel).setLayout(new HorizontalLayout)
		new Label(recursosPanel).setText("Recursos disponibles: ").foreground = Color::BLUE
		new Label(recursosPanel).bindValueToProperty("jardin.recursos")

		this.createResultsGrid(tblPanel)

		val mejoraPanel = new Panel(tblPanel).setLayout(new HorizontalLayout)
		new Label(mejoraPanel).setText("Mejorar planta: ").foreground = Color::BLUE
		val selectorMejora = new Selector(mejoraPanel).allowNull(false)
		selectorMejora.setWidth(230)
		selectorMejora.allowNull(false)
		selectorMejora.bindItems(new ObservableProperty(modelObject, "mejorasPosibles"))
		selectorMejora.bindValueToProperty("mejoraSeleccionada")
		selectorMejora.bindEnabled(new NotNullObservable("plantaSeleccionada"))

		val btnMejorar = new Button(mejoraPanel).setCaption("Mejorar")
		btnMejorar.onClick[|modelObject.mejorar].setAsDefault.disableOnError
		btnMejorar.bindEnabled(new NotNullObservable("mejoraSeleccionada"))
	}

	def protected createResultsGrid(Panel mainPanel) {
		var table = new Table<Planta>(mainPanel, typeof(Planta))
		table.heigth = 200
		table.width = 430
		table.bindItemsToProperty("result")
		table.bindValueToProperty("plantaSeleccionada")
		this.describeResultsGrid(table)
	}

	def void describeResultsGrid(Table<Planta> table) {
		new Column<Planta>(table) //
		.setTitle("Nombre").setFixedSize(150).bindContentsToProperty("nombre")

		new Column<Planta>(table) //
		.setTitle("Ataque").setFixedSize(60).bindContentsToProperty("ataque")

		new Column<Planta>(table).setTitle("Defensa").setFixedSize(60).bindContentsToProperty("defensa")

		new Column<Planta>(table).setTitle("Descripcion").setFixedSize(200).bindContentsToProperty("descripcion")
	}

	override showError(String message) {
		showMessageBox(MessageBox.Type.Error, message)
	}

}
